﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using EntitiesAndMappings.Entities;
using ProyectoActivos.Daos;
using ProyectoActivos.Util;
using ProyectoActivos.Validate;

namespace ProyectoActivos.Forms.Operaciones
{
    public partial class FrmIngreso : Form, IValidateForm
    {
        private bool _valido;

        public static FrmIngreso Activo { get; set; }

        public FrmIngreso()
        {
            InitializeComponent();
            Activo = this;
            _valido = true;
            dGridResultado.AutoGenerateColumns = false;
        }

        private void tStripButtonCrear_Click(object sender, EventArgs e)
        {
            var form = new FrmEditarIngreso(new Ingreso());
            form.ShowDialog(this);
            if (!form.CerroSinAccion)
            {
                btnBuscar_Click(sender, e);
            }
        }

        private void toolStripModificar_Click(object sender, EventArgs e)
        {
            if (dGridResultado.CurrentRow != null)
            {
                var ingresoDao = new IngresoDAO();
                var ingreso = (Ingreso)dGridResultado.CurrentRow.DataBoundItem;
                var form = new FrmEditarIngreso(ingresoDao.Refresh(ingreso));
                form.ShowDialog(this);
                if (!form.CerroSinAccion)
                {
                    btnBuscar_Click(sender, e);
                }
            }
            else
            {
                MessageBox.Show(@"Debe seleccionar un elemento");
            }
        }

        private void tStripButtonEliminar_Click(object sender, EventArgs e)
        {
            if (dGridResultado.CurrentRow != null)
            {
                var ingreso = (Ingreso)dGridResultado.CurrentRow.DataBoundItem;
                ActionExecutor.Execute(this, delegate
                {
                    var ingresoDao = new IngresoDAO();
                    ingresoDao.Delete(ingreso);
                });
                btnBuscar_Click(sender, e);
            }
            else
            {
                MessageBox.Show(@"Debe seleccionar un elemento");
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            errorProvider.Clear();
            _valido = true;
            FormsAssert.AssertTextBoxNotEmptyAndSize(txtAnho,4,errorProvider,this);
            if (IsValid())
            {
                FormsAssert.AssertTextBoxOnlyNumbers(txtAnho,errorProvider,this);
                FormsAssert.AssertComboBoxSelected(cmbMes,errorProvider,this);
                if (((ItemGenericoComboBox)cmbMes.SelectedItem).Id == 0)
                {
                    errorProvider.SetError(cmbMes,"Se debe seleccionar un mes");
                    Invalid();
                }
            }
            ActionExecutor.Execute(this,delegate {
                var ingreso = new Ingreso
                {
                    NumeroGuia = txtNroGuia.Text,
                    NumeroFactura = txtNroFactura.Text,
                    Almacen = (Almacen)cmbAlmacen.SelectedItem
                };
                if (String.IsNullOrEmpty(ingreso.Almacen.Codigo))
                {
                    ingreso.Almacen = null;
                }
                if (!string.IsNullOrEmpty(txtAnho.Text))
                {
                    ingreso.Fecha = new DateTime(int.Parse(txtAnho.Text), ((ItemGenericoComboBox)cmbMes.SelectedItem).Id, 1);
                }
                var ingresoDao = new IngresoDAO();
                dGridResultado.DataSource = ingresoDao.Buscar(ingreso);
            });
        }

        private void FrmIngreso_Load(object sender, EventArgs e)
        {
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 0, Descripcion = "- Ninguno -" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 1, Descripcion = "Enero" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 2, Descripcion = "Febrero" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 3, Descripcion = "Marzo" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 4, Descripcion = "Abril" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 5, Descripcion = "Mayo" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 6, Descripcion = "Junio" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 7, Descripcion = "Julio" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 8, Descripcion = "Agosto" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 9, Descripcion = "Septiembre" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 10, Descripcion = "Octubre" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 11, Descripcion = "Noviembre" });
            cmbMes.Items.Add(new ItemGenericoComboBox{ Id = 12, Descripcion = "Diciembre" });
            cmbMes.SelectedIndex = 0;
            ActionExecutor.Execute(this, delegate
            {
                var almacenDao = new AlmacenDAO();
                var listado = almacenDao.ListarActivos();
                cmbAlmacen.DataSource = AgregaAlmacenNulo(listado);
            });
        }

        private IList<Almacen> AgregaAlmacenNulo(IList<Almacen> listado)
        {
            IList<Almacen> almacenes = new List<Almacen>(listado.Count+1) {new Almacen {Nombre = " Ninguno -"}};
            foreach(var elemento in listado)
            {
                almacenes.Add(elemento);
            }
            return almacenes;
        }

        public void Invalid()
        {
            _valido = false;
        }

        public bool IsValid()
        {
            return _valido;
        }

        private void FrmIngreso_FormClosing(object sender, FormClosingEventArgs e)
        {
            Activo = null;
        }
    }
}
